﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CSGame;
using System.Windows.Forms;
using System.Drawing;

namespace Common
{
    /// <summary>
    /// Предоставляет свойства и методы (в основном - свойства) для работы с шахматными фигурами
    /// </summary>
    public class Figure
    {
        private Player _myPlayer;   // цвет
        private FigureType _myType; // достоинство
        private FigurePosition _pos; //позиция фигуры на доске
        private bool _isAlive;      // не срубили ли случаем
        private bool _checked;      // выбрана ли для хода
        private PictureBox _view;   // изображение фигуры
        private ChessBox _board;    // Ссылка на доску


        #region конструкторы

        /// <summary>
        /// Новая фигура
        /// </summary>
        /// <param name="player">Цвет</param>
        /// <param name="figure">Достоинство</param>
        /// <param name="board">Доска</param>
        public Figure(ChessBox board, Player player, FigureType figure)
        {
            this._myPlayer = player;
            this._myType = figure;
            this._isAlive = true;
            this._checked = false;
            this._board = board;
            AssignPicture(player, figure);
        }
        

        /// <summary>
        /// Новая фигура
        /// </summary>
        /// <param name="player">Цвет</param>
        /// <param name="figure">Достоинство</param>
        /// <param name="vertical">Вертикаль от 0 до 7 (а-h)</param>
        /// <param name="horizontal">Горизонталь от 0 до 7</param>
        /// <param name="board">Доска</param>
        public Figure(ChessBox board, Player player, FigureType figure, int vertical, int horizontal)
        {
            this._myPlayer = player;
            this._myType = figure;
            this._pos.Vertical = vertical;
            this._pos.Horizontal = horizontal;
            this._isAlive = true;
            this._checked = false;
            this._board = board;
            AssignPicture(player, figure);
        }

        #endregion




        #region Свойства

        /// <summary>
        /// Картинка - вид фигуры
        /// </summary>
        public PictureBox View
        {
            get { return _view; }
            set { _view = value; }
        }

        /// <summary>
        /// Позиция фигуры на доске
        /// </summary>
        public FigurePosition Pos
        {
            get { return _pos; }
            set { _pos = value; }
        }

        /// <summary>
        /// Принадлежность фигуры игроку (белый или черный)
        /// </summary>
        public Player MyPlayer
        {
            get { return _myPlayer; }
        }

        /// <summary>
        /// Достоинство фигуры
        /// </summary>  
        public FigureType MyType
        {
            get { return _myType; }
        }
        


        /// <summary>
        /// "Жива" ли еще фигура
        /// </summary>
        public bool IsAlive
        {
            get { return _isAlive; }
            set { _isAlive = value; }
        }


        /// <summary>
        /// Выбрана ли фигура игроком
        /// </summary>
        public bool Checked
        {
            get { return _checked; }
            set 
            { 
                _checked = value;
                if (_checked) // выделение фигуры
                {
                    this.View.BackColor = ChessBox.ClrSelect;
                    _board.SelectStepFields(this); // выделяем поля, на которые можно сходить
                }
                else // сброс выделения
                    this.View.BackColor = ChessBox.ClrNothing;                
            }
        }


        #endregion


        /// <summary>
        /// Ассоциирует изображение с фигурой
        /// </summary>
        /// <param name="c">Цвет</param>
        /// <param name="figure">Фигура</param>
        private void AssignPicture(Player c, FigureType figure)
        {
            View = new PictureBox();
            View.BackColor = ChessBox.ClrNothing;
            View.Parent = _board.PicBoard;
            // загружаем изображение
            if (figure == FigureType.Empty)
            {
                View.Image = global::Common.Properties.Resources.Пустота;
                View.BackColor = ChessBox.ClrSelect;
            }
            else
                if (c == Player.Black) // черные фигуры
                    switch (figure)
                    {
                        case FigureType.Pawn:
                            View.Image = global::Common.Properties.Resources.Черная_пешка;
                            break;
                        case FigureType.Knight:
                            View.Image = global::Common.Properties.Resources.Черный_конь;
                            break;
                        case FigureType.Bishop:
                            View.Image = global::Common.Properties.Resources.Черный_слон;
                            break;
                        case FigureType.Rook:
                            View.Image = global::Common.Properties.Resources.Черная_ладья;
                            break;
                        case FigureType.King:
                            View.Image = global::Common.Properties.Resources.Черный_король;
                            break;
                        case FigureType.Queen:
                            View.Image = global::Common.Properties.Resources.Черный_ферзь;
                            break;
                        default:
                            throw new ChessException("Неведомая фигура");
                    }
                else // белые фигуры
                    switch (figure)
                    {
                        case FigureType.Pawn:
                            View.Image = global::Common.Properties.Resources.Белая_пешка;
                            break;
                        case FigureType.Knight:
                            View.Image = global::Common.Properties.Resources.Белый_конь;
                            break;
                        case FigureType.Bishop:
                            View.Image = global::Common.Properties.Resources.Белый_слон;
                            break;
                        case FigureType.Rook:
                            View.Image = global::Common.Properties.Resources.Белая_ладья;
                            break;
                        case FigureType.King:
                            View.Image = global::Common.Properties.Resources.Белый_король;
                            break;
                        case FigureType.Queen:
                            View.Image = global::Common.Properties.Resources.Белый_ферзь;
                            break;
                        default:
                            throw new ChessException("Неведомая фигура");
                    }
            //View.SizeMode = PictureBoxSizeMode.AutoSize;    // устанавливаем размеры
            View.Width = 35;
            View.Height = 35;

            if (_board.ViewBy == Player.White)  // располагаем на доске
            {
                View.Top = (7 - Pos.Horizontal) * 35 + 10;  
                View.Left = (Pos.Vertical) * 35 + 10;
            }
            else
            {
                View.Top = (Pos.Horizontal) * 35 + 10;
                View.Left = (7 - Pos.Vertical) * 35 + 10;
            }

            View.Click += new EventHandler(Figure_Click); // привязываем событие-выбор фигуры
            View.Show();
            _board.Matrix[Pos.Vertical, Pos.Horizontal] = this;
        }



        /// <summary>
        /// Щелчок по фигуре
        /// </summary>
        private void Figure_Click(object sender, EventArgs e)
        {
            if (_board.PlaingBy == this.MyPlayer && _board.StepBy == this.MyPlayer) // если игрок выбрал свою фигуру и его ход
            {
                _board.SelectFigure(this);
            }
            else // чужая фигура или пустая клетка, в которую можно сходить
            {
                if (this.MyType == FigureType.Empty || this.View.BackColor == ChessBox.ClrBattle)
                    _board.PrepareStep(this);
            }
        }


        /// <summary>
        /// Удаление фигуры
        /// </summary>
        public void Dispose()
        {
            View.Dispose();
        }


        public override string ToString()
        {
            string s = "";
            switch (this._myType)
            {
                case FigureType.Pawn:
                    s = "Пешка";
                    break;
                case FigureType.Knight:
                    s = "Конь";
                    break;
                case FigureType.Bishop:
                    s = "Слон";
                    break;
                case FigureType.Rook:
                    s = "Ладья";
                    break;
                case FigureType.King:
                    s = "Король";
                    break;
                case FigureType.Queen:
                    s = "Ферзь";
                    break;
                case FigureType.Empty:
                    s = "Пустая клетка";
                    break;
                default:
                    throw new ChessException("Неведомая фигура");
            }
            s += _pos.ToString();
            return s;
        }

    }



}
